﻿// CInfoDlg.cpp: 实现文件
//

#include "stdafx.h"
#include "SaleSystem.h"
#include "InfoDlg.h"
#include"InfoFile.h"
#include <stdlib.h>

//全局变量
int sort_column; // 记录点击的列
bool method = true; // 记录比较方法 




// CInfoDlg

IMPLEMENT_DYNCREATE(CInfoDlg, CFormView)

CInfoDlg::CInfoDlg()
	: CFormView(DIALOG_INFO)
{

}

CInfoDlg::~CInfoDlg()
{
}

void CInfoDlg::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, m_list);
}

BEGIN_MESSAGE_MAP(CInfoDlg, CFormView)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, &CInfoDlg::OnColumnclickList1)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CInfoDlg::OnLvnItemchangedList1)
	ON_BN_CLICKED(IDC_BUTTON1, &CInfoDlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CInfoDlg 诊断

#ifdef _DEBUG
void CInfoDlg::AssertValid() const
{
	CFormView::AssertValid();
}

#ifndef _WIN32_WCE
void CInfoDlg::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif
#endif //_DEBUG


// CInfoDlg 消息处理程序




void CInfoDlg::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

	// TODO: 在此添加专用代码和/或调用基类
	m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

	// 初始化表头
	CString field[] = { _T("ID"), _T("名称"), _T("价格"), _T("库存数量") ,_T("订单时间")};
	for (int i = 0; i < sizeof(field) / sizeof(field[0]); ++i)
	{
		m_list.InsertColumn(i, field[i], LVCFMT_CENTER, 90);
	}

	//需要包含#include "InfoFile.h"
	CInfoFile file;
	file.ReadDocline(); //读取商品信息

	//添加数据
	int i = 0;
	CString str;
	for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end(); it++)
	{
		str.Format(_T("%d"), it->id);
		m_list.InsertItem(i, str);
		int column = 1;
		m_list.SetItemText(i, column++, (CString)it->name.c_str());
		str.Format(_T("%d"), it->price);
		m_list.SetItemText(i, column++, str);
		str.Format(_T("%d"), it->num);
		m_list.SetItemText(i, column++, str);
		str.Format(_T("%d"), it->time);
		m_list.SetItemText(i, column++, str);
		//m_list.SetItemText(i, column++, (CString)it->time.c_str());
		i++;
	}
}



	void CInfoDlg::OnColumnclickList1(NMHDR * pNMHDR, LRESULT * pResult)
	{
		LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
		// TODO: 在此添加控件通知处理程序代码
		//iItem:第几行，iSubItem:第几列
		sort_column = pNMLV->iSubItem;//点击的列
		int count = m_list.GetItemCount();//获取列表中的行数
		for (int i = 0; i < count; i++)
			m_list.SetItemData(i, i); // 每行的比较关键字，此处为列序号（点击的列号），可以设置为其他 比较函数的第一二个参数
		m_list.SortItems(CompareFunc, (DWORD_PTR)&m_list);//排序 第一个参数是比较函数，第二个参数传递到回调函数的参数，实际传递的是CListCtrl的this的指针
		method = !method;
		*pResult = 0;
	}

	int   CALLBACK   CInfoDlg::CompareFunc(LPARAM   lParam1, LPARAM   lParam2, LPARAM   lParamSort)
	{
		// 从参数中提取所需比较lc的两行数据
		//回调函数的前两个参数为表列中表项的索引号，第三个参数为排序的表列索引号。
		int row1 = (int)lParam1;
		int row2 = (int)lParam2;
		CListCtrl* lc = (CListCtrl*)lParamSort;
		CString lp1 = lc->GetItemText(row1, sort_column);
		CString lp2 = lc->GetItemText(row2, sort_column);
		// 比较，对不同的列，不同比较，注意记录前一次排序方向，下一次要相反排序
		// int型比较  _ttoi---可以将CString转换成整形
			if (method)
				return _ttoi(lp1) - _ttoi(lp2);
			else
				return _ttoi(lp2) - _ttoi(lp1);

		//建议数字类型的转换为int
		return 0;
	}

	void CInfoDlg::OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
	{
		LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
		// TODO: 在此添加控件通知处理程序代码
		*pResult = 0;
	}


	void CInfoDlg::OnBnClickedButton1()
	{
		//将已被选择的信息全部删除。if没有选择信息，弹出窗口显示错误信息。
		int message = MessageBox(_T("确认删除么？"), _T("删除确认"), MB_YESNO);	//选项是 YES 或者 NO
		int count = m_list.GetSelectedCount();
		POSITION pos = m_list.GetFirstSelectedItemPosition();	//得到列表框的那一行
		if (pos)
		{
			int p = 0;
			while (pos)
			{
				int k = m_list.GetNextSelectedItem(pos);//则返回条目的POSITION值
				m_list.DeleteItem(k - p);	//则返回列表视图控件中下一个被选中的条目索引
				p++;
			}
			CFile ofs(L".\stock.txt", CFile::modeCreate | CFile::modeReadWrite);//输出方式打开文件
			int index = m_list.GetItemCount();
			for (int i = 0; i < index; i++)
			{
				for (int j = 0; j < 5; j++)
				{
					CString a;
					if (j != 5)
						a = m_list.GetItemText(i, j) + '|';	//从控件获取信息
					if (j == 5 && i != index - 1)
					{
						a = m_list.GetItemText(i, j) + '\t';	//回退一格
						a += "\r\n";	//回车+换行
					}
					if (j == 5 && i == index - 1)
						a = m_list.GetItemText(i, j) + '\t';
					ofs.Write(a, a.GetLength());	//统计cstring类的长度
				}
			}
		}
		else
			MessageBox(L"请选择需要删除的信息！", L"提示!");
	}
